8  ' ********************************************

10 ' ***  FFT08-01 *** POSITIVE FREQUENCY FFT ***

11 ' ********************************************

12 CLS : PRINT "INPUT NUMBER OF DATA POINTS AS 2^N"

14 INPUT "N = "; N

16 Q = 2 ^ N: N1 = N - 1: Q1 = Q - 1: Q2 = Q / 2: Q3 = Q2 - 1: Q4 = Q / 4: Q5 = Q4 - 1

18 Q8 = Q / 8: Q9 = Q8 - 1: Q34 = Q2 + Q4: Q16 = Q / 16

20 DIM Y(Q), C(Q), S(Q), KC(Q2), KS(Q2)

30 PI = 3.14159265358979#: P2 = PI * 2: K1 = P2 / Q

32 FOR I = 0 TO Q3: KC(I) = COS(I * K1): KS(I) = SIN(I * K1): NEXT I

38 '    ********   MAIN MENU   ********

40 CLS : PRINT SPC(30); "MAIN MENU": PRINT : PRINT

60 PRINT SPC(5); "1 = ANALYZE SINE WAVE FUNCTION": PRINT

62 PRINT SPC(5); "2 = INVERSE TRANSFORM": PRINT

64 PRINT SPC(5); "3 = PRINT RESULTS": PRINT

66 PRINT SPC(5); "4 = EXIT": PRINT

70 PRINT SPC(10); "MAKE SELECTION: ";

80 A$ = INKEY$: IF A$ = "" THEN 80

82 PRINT A$

90 A = VAL(A$): ON A GOSUB 600, 200, 350, 900

92 GOTO 40

98  '         *****************************

100 '         ***   FORWARD TRANSFORM   ***

102 '         *****************************

106 '          ***  TRANSFORM STAGE 1  ***

108 T9 = TIMER

110 C(0) = (S(0) + S(Q2)) / 2: C(1) = (S(0) - S(Q2)) / 2

112 FOR I = 1 TO Q3: I2 = 2 * I: INDX = 0

114 FOR J = 0 TO N1: IF I AND 2 ^ J THEN INDX = INDX + 2 ^ (N - 2 - J)

116 NEXT J

118 C(I2) = (S(INDX) + S(INDX + Q2)) / 2: C(I2 + 1) = (S(INDX) - S(INDX + Q2)) / 2

120 NEXT I

122 FOR I = 0 TO Q1: S(I) = 0: NEXT I

'       *********  REMAINING STAGES  **********

124 FOR M = 1 TO N1: QP = 2 ^ M: QPI = 2 ^ (N1 - M)

126  FOR K = 0 TO QPI - 1

128   FOR J = 0 TO QP / 2: J0 = J + (2 * K * QP): J1 = J0 + QP: K2 = QPI * J

130   JI = J1 - (2 * J)

132   CTEMP1 = C(J0) + C(J1) * KC(K2) - S(J1) * KS(K2)

134   STEMP1 = S(J0) + C(J1) * KS(K2) + S(J1) * KC(K2)

136   CTEMP2 = C(J0) - C(J1) * KC(K2) + S(J1) * KS(K2)

138   S(JI) = (C(J1) * KS(K2) + S(J1) * KC(K2) - S(J0)) / 2

140   C(J0) = CTEMP1 / 2: S(J0) = STEMP1 / 2: C(JI) = CTEMP2 / 2

142   NEXT J

144  NEXT K

146 NEXT M

148 FOR J = Q2 + 1 TO Q1: C(J) = 0: S(J) = 0: NEXT J

150 T9 = TIMER - T9: SK1 = 2

152 NM$ = "TRANSFORMED FUNCTION": RETURN



REM ****************************************************

REM *              INVERSE TRANSFORM                   *

REM ****************************************************

200 PRINT : T9 = TIMER: SK1 = 1

202 FOR M = N1 TO 1 STEP -1' LOOP FOR STAGES OF COMPUTATION

204  QP2 = 2 ^ (M): QP = INT(QP / 2): QP4 = 2 * QP2: QPI = 2 ^ (N1 - M)

206  FOR I = 0 TO Q - (QP2) STEP QP4

208   FOR J = 0 TO QP: KI = J + I: KT = J * QPI: KJ = QP2 + KI

212    MCT = C(J + I) - C(I + QP2 - J): MST = S(J + I) + S(I + QP2 - J)

214    CTEMP = MCT * KC(KT) + MST * KS(KT)

216    STEMP = MST * KC(KT) - MCT * KS(KT)

218    CTEMP2 = (2 * C(J + I)) - CTEMP * KC(KT) + STEMP * KS(KT)

220    S(KI) = (2 * S(J + I)) - CTEMP * KS(KT) - STEMP * KC(KT)

222    C(KJ) = CTEMP: S(KJ) = STEMP: C(KI) = CTEMP2

224   NEXT J

226  NEXT I

228 NEXT M

229 '    ********  FINAL STAGE  ********

230 FOR I = 0 TO Q3: I2 = 2 * I: INDX = 0

232 FOR J = 0 TO N1: IF I AND 2 ^ J THEN INDX = INDX + 2 ^ (N - 2 - J)

234 NEXT J

236 S(INDX) = C(I2) + C(I2 + 1): S(INDX + Q2) = C(I2) - C(I2 + 1)

238 NEXT I

240 FOR I = 0 TO Q1: C(I) = 0: NEXT I

242 T9 = TIMER - T9

244 NM$ = "TIME DOMAIN FUNCTION": RETURN



'         ********************************

'         *******   PRINT OUTPUT   *******

'         ********************************

350 CLS : PRINT SPC(16); "*****   "; NM$; "   *****"

352 PRINT "  FREQ    F(COS)     F(SIN)         FREQ     F(COS)     F(SIN)"

354 PRINT

362 TZT = 20: FOR Z = 0 TO Q4' PRINT OUTPUT

364 PRINT USING "####"; Z; : PRINT "   ";

366 PRINT USING "+##.#####"; SK1 * C(Z); : PRINT "   ";

368 PRINT USING "+##.#####"; SK1 * S(Z); : PRINT "     ";

370 PRINT USING "######"; Z + Q4; : PRINT "   ";

372 PRINT USING "+##.#####"; SK1 * C(Z + Q4); : PRINT "   ";

374 PRINT USING "+##.#####"; SK1 * S(Z + Q4)

376 IF Z > TZT THEN TZT = TZT + 20: INPUT A$

378 NEXT Z

380 PRINT : PRINT "T = "; T9: INPUT "ENTER TO CONTINUE"; A$

382 RETURN



'

600 ' ***  GENERATE SINE WAVE COMPONENT  ***

602 CLS : PRINT : PRINT

604 INPUT "PLEASE SPECIFY FREQUENCY"; F9

608 WTMSG$ = "                    PREPARING DATA - PLEASE WAIT"

610 FOR I = 0 TO Q1: C(I) = 0: S(I) = SIN(F9 * K1 * I): NEXT I

618 T9 = TIMER

620 GOSUB 100 'TAKE TRANSFORM

622 GOSUB 350 ' DISPLAY TRANSFORM

630 RETURN 'BACK TO MAIN MENU

' **********

900 STOP ' THAT'S ALL FOLKS



